home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / os2 / pvm34b3.zip / pvm34b3 / pvm3 / src / waitc.c < prev    next >
C/C++ Source or Header  |  1997-07-22  |  8KB  |  372 lines

  1.  
  2. static char rcsid[] =
  3.     "$Id: waitc.c,v 1.6 1997/06/27 17:32:59 pvmsrc Exp $";
  4.  
  5. /*
  6.  *         PVM version 3.4:  Parallel Virtual Machine System
  7.  *               University of Tennessee, Knoxville TN.
  8.  *           Oak Ridge National Laboratory, Oak Ridge TN.
  9.  *                   Emory University, Atlanta GA.
  10.  *      Authors:  J. J. Dongarra, G. E. Fagg, M. Fischer
  11.  *          G. A. Geist, J. A. Kohl, R. J. Manchek, P. Mucci,
  12.  *         P. M. Papadopoulos, S. L. Scott, and V. S. Sunderam
  13.  *                   (C) 1997 All Rights Reserved
  14.  *
  15.  *                              NOTICE
  16.  *
  17.  * Permission to use, copy, modify, and distribute this software and
  18.  * its documentation for any purpose and without fee is hereby granted
  19.  * provided that the above copyright notice appear in all copies and
  20.  * that both the copyright notice and this permission notice appear in
  21.  * supporting documentation.
  22.  *
  23.  * Neither the Institutions (Emory University, Oak Ridge National
  24.  * Laboratory, and University of Tennessee) nor the Authors make any
  25.  * representations about the suitability of this software for any
  26.  * purpose.  This software is provided ``as is'' without express or
  27.  * implied warranty.
  28.  *
  29.  * PVM version 3 was funded in part by the U.S. Department of Energy,
  30.  * the National Science Foundation and the State of Tennessee.
  31.  */
  32.  
  33. /*
  34.  *    waitc.c
  35.  *
  36.  *    Wait context descriptors.
  37.  *
  38. $Log: waitc.c,v $
  39.  * Revision 1.6  1997/06/27  17:32:59  pvmsrc
  40.  * Updated for WIN32 header files & Authors.
  41.  *
  42.  * Revision 1.5  1997/03/06  21:50:24  pvmsrc
  43.  * Yanked out #includes for <netinet/in.h> and <netinet/tcp.h>.
  44.  *     - dups with lpvm.h #includes...
  45.  *
  46.  * Revision 1.4  1997/01/28  19:27:52  pvmsrc
  47.  * New Copyright Notice & Authors.
  48.  *
  49.  * Revision 1.3  1996/10/25  13:58:10  pvmsrc
  50.  * Replaced old #includes for protocol headers:
  51.  *     - <pvmsdpro.h>, "ddpro.h", "tdpro.h"
  52.  * With #include of new combined header:
  53.  *     - <pvmproto.h>
  54.  *
  55.  * Revision 1.2  1996/10/24  21:18:31  pvmsrc
  56.  * Moved #include "global.h" to end of #include's for typing.
  57.  * Added #include of new "lpvm.h" in place of explicitly extern-ed
  58.  *     globals...
  59.  *
  60.  * Revision 1.1  1996/09/23  23:44:47  pvmsrc
  61.  * Initial revision
  62.  *
  63.  * Revision 1.6  1995/11/02  16:36:44  manchek
  64.  * added NEEDSENDIAN switch
  65.  *
  66.  * Revision 1.5  1995/07/28  16:04:07  manchek
  67.  * switch endian includes on flag, not arch name
  68.  *
  69.  * Revision 1.4  1995/07/19  21:27:33  manchek
  70.  * use new function pvmnametag instead of [dts]mname
  71.  *
  72.  * Revision 1.3  1994/07/18  19:25:18  manchek
  73.  * wait_get() checks hostpart, ignoring TIDPVMD.
  74.  * added create/free logging
  75.  *
  76.  * Revision 1.2  1994/06/03  20:38:32  manchek
  77.  * version 3.3.0
  78.  *
  79.  * Revision 1.1  1993/08/30  23:26:52  manchek
  80.  * Initial revision
  81.  *
  82.  */
  83.  
  84. #include <stdio.h>
  85. #ifdef NEEDMENDIAN
  86. #include <machine/endian.h>
  87. #endif
  88. #ifdef NEEDENDIAN
  89. #include <endian.h>
  90. #endif
  91. #ifdef NEEDSENDIAN
  92. #include <sys/endian.h>
  93. #endif
  94. #ifndef WIN32
  95. #include <rpc/types.h>
  96. #include <rpc/xdr.h>
  97. #include <sys/time.h>
  98. #include <sys/socket.h>
  99. #else
  100. #include "..\xdr\types.h"
  101. #include "..\xdr\xdr.h"
  102. #endif
  103.  
  104. #ifdef IMA_TITN
  105. #include <bsd/sys/types.h>
  106. #else
  107. #include <sys/types.h>
  108. #endif
  109.  
  110. #ifdef    SYSVSTR
  111. #include <string.h>
  112. #else
  113. #include <strings.h>
  114. #endif
  115.  
  116. #include <pvm3.h>
  117. #include <pvmproto.h>
  118. #include "pvmalloc.h"
  119. #include "pmsg.h"
  120. #include "listmac.h"
  121. #include "bfunc.h"
  122. #include "lpvm.h"
  123. #include "host.h"
  124. #include "waitc.h"
  125. #include "global.h"
  126.  
  127.  
  128. /***************
  129.  **  Globals  **
  130.  **           **
  131.  ***************/
  132.  
  133. extern void pvmbailout();
  134. char *pvmnametag();
  135.  
  136.  
  137. /***************
  138.  **  Private  **
  139.  **           **
  140.  ***************/
  141.  
  142. static int widbase = 0;
  143. static int widrange = ~0;
  144. static char *waitnames[] = {
  145.     "addhost", "spawn", "hoststart", "task",
  146.     "delhost", "htupd", "pstat", "taskx",
  147.     "mstat", "db", "hostf", "hosta", "hostsync",
  148.     "taskstart",
  149.     "routea", "routed"
  150. };
  151.  
  152.  
  153. static char *
  154. waitkind(kind)
  155.     int kind;
  156. {
  157.     if (kind < 1 || kind > sizeof(waitnames)/sizeof(waitnames[0]))
  158.         return "???";
  159.     return waitnames[kind - 1];
  160. }
  161.  
  162.  
  163. /*****************
  164.  **  Interface  **
  165.  **             **
  166.  *****************/
  167.  
  168. /*    wait_init()
  169. *
  170. *    Call this boy before any other wait stuff.
  171. */
  172.  
  173. void
  174. wait_init(base, range)
  175.     int base;            /* base value for wait context ids */
  176.     int range;            /* mask for id generation */
  177. {
  178.     if (!waitlist) {
  179.         widbase = base;
  180.         widrange = range;
  181.         waitlist = TALLOC(1, struct waitc, "wait");
  182.         BZERO((char*)waitlist, sizeof(struct waitc));
  183.         waitlist->wa_link = waitlist;
  184.         waitlist->wa_rlink = waitlist;
  185.     }
  186. }
  187.  
  188.  
  189. /*    wait_new()
  190. *
  191. *    Create new wait context of given kind with no peers.  Add to
  192. *    active list.
  193. */
  194.  
  195. struct waitc *
  196. wait_new(kind)
  197.     int kind;
  198. {
  199.     static int lastwid = 0;        /* last wid assigned */
  200.  
  201.     int startwid;                /* to detect when we've tried all */
  202.     int wid;
  203.     struct waitc *wp, *wp2;
  204.  
  205.     /*
  206.     * find a unique wid by incrementing lastwid and stepping through
  207.     * waitlist until we find a vacant slot.
  208.     */
  209.  
  210.     if (++lastwid > widrange)
  211.         lastwid = 1;
  212.     startwid = lastwid;
  213.     wp = waitlist;
  214.  
  215.     while (1) {
  216.         wid = widbase + lastwid;
  217.         while (wp->wa_wid < wid)
  218.             if ((wp = wp->wa_link) == waitlist)
  219.                 break;
  220.  
  221.         if (wp->wa_wid != wid)
  222.             break;
  223.  
  224.         if (++lastwid > widrange) {
  225.             lastwid = 1;
  226.             wp = waitlist;
  227.         }
  228.         if (lastwid == startwid) {
  229.             pvmlogprintf("wait_new() out of wids\n");
  230.             pvmbailout(0);        /* XXX this is kinda harsh */
  231.         }
  232.     }
  233.  
  234.     /*
  235.     * initialze new w context and add to list
  236.     */
  237.  
  238.     if (!(wp2 = TALLOC(1, struct waitc, "wait"))) {
  239.         pvmlogprintf("wait_new() can't get memory\n");
  240.         pvmbailout(0);
  241.     }
  242.     wp2->wa_wid = wid;
  243.     wp2->wa_kind = kind;
  244.     wp2->wa_peer = wp2->wa_rpeer = wp2;
  245.  
  246.     wp2->wa_on = wp2->wa_tid = wp2->wa_dep = 0;
  247.     wp2->wa_mesg = 0;
  248.     wp2->wa_count = 0;
  249.     wp2->wa_spec = 0;
  250.  
  251.     LISTPUTBEFORE(wp, wp2, wa_link, wa_rlink);
  252.     if (pvmdebmask & PDMWAITC) {
  253.         pvmlogprintf("wait_new():\n");
  254.         wait_dump(wp2);
  255.     }
  256.     return wp2;
  257. }
  258.  
  259.  
  260. /*    wait_find()
  261. *
  262. *    Find a wait context in active list by id.  Returns pointer
  263. *    or 0 if not found.
  264. */
  265.  
  266. struct waitc *
  267. wait_find(wid)
  268.     int wid;
  269. {
  270.     struct waitc *wp;
  271.  
  272.     for (wp = waitlist->wa_link; wp != waitlist; wp = wp->wa_link)
  273.         if (wp->wa_wid == wid)
  274.             return wp;
  275.     return (struct waitc*)0;
  276. }
  277.  
  278.  
  279. /*    wait_delete()
  280. *
  281. *    Remove a wait context from the active list, disassociate from
  282. *    any peers and destroy it.
  283. */
  284.  
  285. void
  286. wait_delete(wp)
  287.     struct waitc *wp;
  288. {
  289.     if (pvmdebmask & PDMWAITC) {
  290.         pvmlogprintf("wait_delete():\n");
  291.         wait_dump(wp);
  292.     }
  293.     if (wp->wa_mesg)
  294.         pmsg_unref(wp->wa_mesg);
  295.  
  296.     if (wp->wa_link) {
  297.         LISTDELETE(wp, wa_link, wa_rlink);
  298.     }
  299.     if (wp->wa_peer) {
  300.         LISTDELETE(wp, wa_peer, wa_rpeer);
  301.     }
  302.     PVM_FREE(wp);
  303. }
  304.  
  305.  
  306. /*    wait_get()
  307. *
  308. *    Find the wait context in waitlist for a given message.
  309. *    If hp != 0, check that message came from correct host.
  310. *    If kind != 0, check that message is correct kind.
  311. */
  312.  
  313. struct waitc *
  314. wait_get(hp, mp, kind)
  315.     struct hostd *hp;
  316.     struct pmsg *mp;
  317.     int kind;
  318. {
  319.     struct waitc *wp;
  320.  
  321.     if (!mp->m_wid)
  322.         return 0;
  323.     if (!(wp = wait_find(mp->m_wid))) {
  324.         pvmlogprintf("waitc_get() tag %s from t%x wid %d not found\n",
  325.                 pvmnametag(mp->m_tag, (int *)0), mp->m_src, mp->m_wid);
  326.         return 0;
  327.     }
  328.     if (hp && hp->hd_hostpart != (wp->wa_on & TIDHOST)) {
  329.         pvmlogprintf("waitc_get() tag %s from t%x wid %d wrong host\n",
  330.                 pvmnametag(mp->m_tag, (int *)0), mp->m_src, mp->m_wid);
  331.         return 0;
  332.     }
  333.     if (kind && kind != wp->wa_kind) {
  334.         pvmlogprintf("waitc_get() tag %s from t%x wid %d wrong kind: %s\n",
  335.                 pvmnametag(mp->m_tag, (int *)0), mp->m_src, mp->m_wid,
  336.                 waitkind(wp->wa_kind));
  337.         return 0;
  338.     }
  339.     return wp;
  340. }
  341.  
  342.  
  343. void
  344. wait_dump(wp)
  345.     struct waitc *wp;
  346. {
  347.     struct waitc *wp2;
  348.  
  349.     pvmlogprintf("wid %d kind %s on 0x%x tid 0x%x dep %d peer {",
  350.             wp->wa_wid,
  351.             waitkind(wp->wa_kind),
  352.             wp->wa_on,
  353.             wp->wa_tid,
  354.             wp->wa_dep);
  355.     for (wp2 = wp->wa_peer; wp2 != wp; wp2 = wp2->wa_peer)
  356.         pvmlogprintf(" %d", wp2->wa_wid);
  357.     pvmlogprintf(" } cnt %d\n", wp->wa_count);
  358. }
  359.  
  360.  
  361. void
  362. wait_dumpall()
  363. {
  364.     struct waitc *wp;
  365.  
  366.     pvmlogprintf("wait_dumpall()\n");
  367.     for (wp = waitlist->wa_link; wp != waitlist; wp = wp->wa_link)
  368.         wait_dump(wp);
  369. }
  370.  
  371.  
  372.